package com.it.schoolhomeos.service;

import com.it.schoolhomeos.entity.Notification;
import com.it.schoolhomeos.enums.NotificationStatus;
import com.it.schoolhomeos.enums.NotificationTargetRole;
import com.it.schoolhomeos.enums.NotificationType;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * 通知服务接口
 * 
 * 定义通知相关的业务逻辑操作
 * 包括通知的查询、创建、更新和删除等功能
 */
public interface NotificationService {
    
    /**
     * 创建通知
     * 
     * @param notification 通知对象
     * @param attachments 附件文件列表
     * @param coverImage 封面图片
     * @return 创建的通知对象
     */
    Notification createNotification(Notification notification, List<MultipartFile> attachments, MultipartFile coverImage);
    
    /**
     * 更新通知
     * 
     * @param notification 通知对象
     * @param attachments 附件文件列表
     * @param coverImage 封面图片
     * @return 更新后的通知对象
     */
    Notification updateNotification(Notification notification, List<MultipartFile> attachments, MultipartFile coverImage);
    
    /**
     * 根据ID查询通知
     * 
     * @param id 通知ID
     * @return 通知对象
     */
    Notification getNotificationById(Long id);
    
    /**
     * 根据ID删除通知
     * 
     * @param id 通知ID
     */
    void deleteNotification(Long id);
    
    /**
     * 根据通知类型和状态查询通知列表
     * 
     * @param type 通知类型
     * @param status 通知状态
     * @param pageable 分页参数
     * @return 通知分页列表
     */
    Page<Notification> getNotificationsByTypeAndStatus(
            NotificationType type, NotificationStatus status, Pageable pageable);
    
    /**
     * 根据通知类型、状态和目标角色查询通知列表
     * 
     * @param type 通知类型
     * @param status 通知状态
     * @param targetRole 目标角色
     * @param pageable 分页参数
     * @return 通知分页列表
     */
    Page<Notification> getNotificationsByTypeAndStatusAndTargetRole(
            NotificationType type, NotificationStatus status, NotificationTargetRole targetRole, Pageable pageable);
    
    /**
     * 根据通知类型、状态和班级ID查询通知列表
     * 
     * @param type 通知类型
     * @param status 通知状态
     * @param classId 班级ID
     * @param pageable 分页参数
     * @return 通知分页列表
     */
    Page<Notification> getNotificationsByTypeAndStatusAndClassId(
            NotificationType type, NotificationStatus status, Long classId, Pageable pageable);
    
    /**
     * 查询置顶的通知列表
     * 
     * @param status 通知状态
     * @return 置顶通知列表
     */
    List<Notification> getTopNotifications(NotificationStatus status);
    
    /**
     * 根据标题模糊查询通知列表
     * 
     * @param title 标题关键字
     * @param status 通知状态
     * @param pageable 分页参数
     * @return 通知分页列表
     */
    Page<Notification> searchNotificationsByTitle(String title, NotificationStatus status, Pageable pageable);
    
    /**
     * 获取所有通知
     * 
     * @param pageable 分页参数
     * @return 通知分页列表
     */
    Page<Notification> getAllNotifications(Pageable pageable);
    
    /**
     * 设置通知置顶状态
     * 
     * @param id 通知ID
     * @param isTop 是否置顶
     * @return 更新后的通知对象
     */
    Notification setNotificationTopStatus(Long id, Boolean isTop);
    
    /**
     * 更新通知状态
     * 
     * @param id 通知ID
     * @param status 通知状态
     * @return 更新后的通知对象
     */
    Notification updateNotificationStatus(Long id, NotificationStatus status);
} 